package aplicacion.database;

import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Time;
import java.util.ArrayList;
import java.util.Random;

import org.eclipse.swt.graphics.Color;

import algoritmo.Cuadrante;
import algoritmo.Trabaja;
import aplicacion.utilidades.Util;

/**
 * Aquí se encuentran los métodos de acceso a la base de datos.
 * 
 * @author grupo bases de datos
 * 
 */
public class DatabaseMySQL extends Thread implements i_Database {
	private boolean intentandoConectar = false;
	private Connection con;
	private Statement st;
	private ResultSet rs;
	
	String userName = "turnomat_user";
	String password = "is0708";
	String ip = "72.34.56.241:3306";
	String dbName = "";

	public void setConfig(String userName, String password, String ip, String dbName) {
		this.userName = userName;
		this.password = password;
		this.ip = ip;
		this.dbName = dbName;
	};

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#abrirConexion()
	 */
	public synchronized boolean abrirConexion() {
		boolean conectado = false;
		intentandoConectar = true;
		String url = "jdbc:mysql://"+ ip +"/" + dbName;

		try {
			Class.forName("com.mysql.jdbc.Driver").newInstance();
			con = DriverManager.getConnection(url, userName, password);
		
		} catch (SQLException e) {
			System.err.println("Database :: Error en conexión: " + e.getMessage() +
					"\n - IP:         " + ip + 
					"\n - Usuario:    " + userName + 
					"\n - Contraseña: " + password);
		} catch (Exception e) {
			e.printStackTrace();
			System.err.println("Database :: Error al instanciar el conector MySQL: " + e.getMessage());
		}

		conectado = true;
		intentandoConectar = false;

	
		return conectado;
	}
	
	
	
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#borraContrato(int)
	 */
	public boolean borraContrato(int id) {
		boolean correcto = false;
		String q = "DELETE FROM " + tablaContratos + " WHERE IdContrato=" + id;
		try {
			st = con.createStatement();
			st.executeUpdate(q);
			correcto = true;
		} catch (SQLException e) {
			System.err.println("Database :: Error al borrar el contrato:\n\t" + q);
		}
		return correcto;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#borraContratoConTurnos(int)
	 */
	public boolean borraContratoConTurnos(int idContrato){
		boolean correcto = false;
		String q = "DELETE FROM " + tablaTurnosPorContrato + " WHERE IdContrato=" + idContrato;
		try {
			st = con.createStatement();
			st.executeUpdate(q);
			correcto = true;
		} catch (SQLException e) {
			System.err.println("Database :: Error al borrar el contrato y sus turnos de ListaTurnosPorContrato:\n\t" + q);
		}
		return correcto;
	}
	
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#borraContratosDepartamento(int)
	 */
	public boolean borraContratosDepartamento(int idContrato){
		boolean correcto = false;
		String q = "DELETE FROM " + tablaContratosPorDepartamento + " WHERE IdContrato=" + idContrato;
		try {
			st = con.createStatement();
			st.executeUpdate(q);
			correcto = true;
		} catch (SQLException e) {
			System.err.println("Database :: Error al borrar el contrato y su departamento asociado:\n\t" + q);
		}
		return correcto;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#borraDepartamento(java.lang.String)
	 */
	public boolean borraDepartamento(String nombre) {
		boolean correcto = false;
		String q = "DELETE FROM " + tablaDepartamentos + " WHERE Nombre='" + nombre + "'";
		try {
			st = con.createStatement();
			st.executeUpdate(q);
			correcto = true;
		} catch (SQLException e) {
			System.err.println("Database :: Error al borrar el departamento:\n\t" + q);
		}
		return correcto;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#borraEmpleado(int)
	 */
	public boolean borraEmpleado(int NumVendedor) {
		boolean correcto = false;
		try {
			st = con.createStatement();
			
			st.executeUpdate("DELETE FROM " + tablaUsuariosPorDepartamento + " WHERE NumVendedor=" + NumVendedor);
			st.executeUpdate("DELETE FROM " + tablaMensajes + " WHERE Remitente=" + NumVendedor);
			st.executeUpdate("DELETE FROM " + tablaDestinatariosMensaje + " WHERE NumVendedor=" + NumVendedor);
			st.executeUpdate("DELETE FROM " + tablaIncidenciasPorUsuario + " WHERE NumVendedor=" + NumVendedor);
			st.executeUpdate("DELETE FROM " + tablaTrabaja + " WHERE NumVendedor=" + NumVendedor);
			st.executeUpdate("DELETE FROM " + tablaVentas + " WHERE NumVendedor=" + NumVendedor);
			st.executeUpdate("DELETE FROM " + tablaDepartamentos + " WHERE JefeDepartamento=" + NumVendedor);
			st.executeUpdate("DELETE FROM " + tablaUsuarios + " WHERE NumVendedor=" + NumVendedor);
			
			correcto = true;
		} catch (SQLException e) {
			e.printStackTrace();
			System.err.println("Database :: Error al borrar el empleado");
		}
		return correcto;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#borraMensaje(int)
	 */
	public boolean borraMensaje(int id) {
		boolean correcto = false;
		String q = "DELETE FROM " + tablaMensajes + " WHERE IdMensaje=" + id;
		try {
			st = con.createStatement();
			st.executeUpdate(q);
			correcto = true;
		} catch (SQLException e) {
			System.err.println("Database :: Error al Borrar el mensaje");
		}
		return correcto;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#borraMesTrabaja(int, int, int, java.lang.String)
	 */
	public boolean borraMesTrabaja(int dia, int mes, int anio,String dep){
		String fechaIni = anio +"-"+ mes +"-"+ dia;
		String fechaFin = anio +"-"+ mes +"-"+ "31";
		String q = "DELETE FROM " + tablaTrabaja + " WHERE Fecha >='" + fechaIni + "' and Fecha <='" +
		fechaFin +"' and NumVendedor in (SELECT NumVendedor FROM " + tablaUsuariosPorDepartamento + " D where NombreDepartamento = '"+dep +"');";
		boolean correcto = false;
		try {
			st = con.createStatement();
			st.executeUpdate(q);
			correcto = true;
		} catch (SQLException e) {
			System.err.println("Database :: Error al borrar el mes de La tabla trabaja:\n\t" + q);			
			System.err.println(e.getMessage());			
		}
		return correcto;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#borraNombreDepartamentoUsuario(java.lang.String)
	 */
	public boolean borraNombreDepartamentoUsuario(String nombre) {
		boolean correcto = false;
		String q = "DELETE FROM " + tablaUsuariosPorDepartamento + " WHERE NombreDepartamento='" + nombre + "'";
		try {
			st = con.createStatement();
			st.executeUpdate(q);
			correcto = true;
		} catch (SQLException e) {
			System.err.println("Database :: Error al borrar en DepartamentoUsuario:\n\t" + q);
		}
		return correcto;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#borraNumerosDepartamentos(java.lang.String)
	 */
	public boolean borraNumerosDepartamentos(String nombre) {
		boolean correcto = false;
		String q = "DELETE FROM " + tablaNumerosPorDepartamento + " WHERE Nombre='" + nombre + "'";
		try {
			st = con.createStatement();
			st.executeUpdate(q);
			correcto = true;
		} catch (SQLException e) {
			System.err.println("Database :: Error al Borrar el departamento:\n\t" + q);
		}
		return correcto;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#borraTurno(int)
	 */
	public boolean borraTurno(int id) {
		boolean correcto = false;
		try {
			st = con.createStatement();
			st.executeUpdate("DELETE FROM " + tablaTurnos + " WHERE IdTurno=" + id);
			correcto = true;
		} catch (SQLException e) {
			System.err.println("Database :: Error al borrar el turno");
		}
		return correcto;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#borraTurnoDeContrato(int, int)
	 */
	public boolean borraTurnoDeContrato(int idTurno, int idContrato){
		boolean correcto = false;
		String q = "DELETE FROM " + tablaTurnosPorContrato + " WHERE IdTurno=" + idTurno 
		 + " and IdContrato= "+ idContrato;
		try {
			st = con.createStatement();
			st.executeUpdate(q);
			correcto = true;
		} catch (SQLException e) {
			System.err.println("Database :: Error al borrar el turno de ListaTurnosPorContrato");
		}
		return correcto;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#borraUsuario(int)
	 */
	public boolean borraUsuario(int id) {
		boolean correcto = false;
		try {
			st = con.createStatement();
			st.executeUpdate("DELETE FROM " + tablaUsuarios + " WHERE NumVendedor=" + id);
			correcto = true;
		} catch (SQLException e) {
			System.err.println("Database :: Error al Borrar el usuario");
		}
		return correcto;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#borraUsuarioDepartamentoUsuario(int)
	 */
	public boolean borraUsuarioDepartamentoUsuario(int nv) {
		boolean correcto = false;
		try {
			st = con.createStatement();
			st.executeUpdate("DELETE FROM " + tablaUsuariosPorDepartamento + " WHERE NumVendedor='" + nv
					+ "'");
			correcto = true;
		} catch (SQLException e) {
			System.err.println("Database :: Error al Borrar en DepartamentoUsuario");
		}
		return correcto;
	}
	
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#borraSugerencias(int, int, int, int, java.lang.String)
	 */
	public boolean borraSugerencias(int diaIni, int diaFin, int mes, int anio, String dep) {
		String fechaIni = anio +"-"+ mes +"-" + diaIni;
		String fechaFin = anio +"-"+ mes +"-" + diaFin;
		String q = "DELETE FROM " + tablaSugerencias + " WHERE Fecha >='" + fechaIni + "' and Fecha <='" +
						fechaFin +"' and NombreDept = '"+dep +"';";
		boolean correcto = false;
		try {
			st = con.createStatement();
			st.executeUpdate(q);
			correcto = true;
		} catch (SQLException e) {
			System.err.println("Database :: Error al borrar el mes de la tabla sugerencias:\n\t" + q);			
			System.err.println(e.getMessage());			
		}
		return correcto;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#cambiaNombreDepartamento(java.lang.String, java.lang.String)
	 */
	public boolean cambiaNombreDepartamento(String NombreAntiguo, String NombreNuevo) {
		int r = 0;
		try {
			st = con.createStatement();
			r = st.executeUpdate("UPDATE " + tablaDepartamentos + " SET Nombre='"
					+ NombreNuevo + "'" + " WHERE Nombre='" + NombreAntiguo + "';");
		} catch (SQLException e) {
			System.err.println("Database :: Error Cambiar Nombre del Depto. en la BD");
			return false;
		}
		return true;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#cambiaNombreDepartamentoUsuario(java.lang.String, java.lang.String)
	 */
	public boolean cambiaNombreDepartamentoUsuario(String NombreAntiguo, String NombreNuevo) {
		int r = 0;
		try {
			st = con.createStatement();
			r = st.executeUpdate("UPDATE " + tablaUsuariosPorDepartamento + " SET NombreDepartamento='"
					+ NombreNuevo + "'" + " WHERE NombreDepartamento='" + NombreAntiguo + "';");
		} catch (SQLException e) {
			System.err.println("Database :: Error Cambiar Nombre del Depto. en la BD");
			return false;
		}
		return true;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#cambiaNombreNumerosDEPARTAMENTOs(java.lang.String, java.lang.String)
	 */
	public boolean cambiaNombreNumerosDEPARTAMENTOs(String NombreAntiguo, String NombreNuevo) {
		int r = 0;
		try {
			st = con.createStatement();
			r = st.executeUpdate("UPDATE " + tablaNumerosPorDepartamento + " SET Nombre='"
					+ NombreNuevo + "'" + " WHERE Nombre='" + NombreAntiguo + "';");
		} catch (SQLException e) {
			System.err.println("Database :: Error Cambiar Nombre del Depto. en la BD");
			return false;
		}
		return true;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#cambiarContrato(int, int, java.lang.String, java.lang.String, int, double, int)
	 */
	public boolean cambiarContrato(int IdContrato, int TurnoInicial,
			String Nombre, String Patron, int DuracionCiclo, double Salario,
			int Tipo) {
		int r = 0;
		try {
			st = con.createStatement();
			r = st.executeUpdate("UPDATE " + tablaContratos + " SET TurnoInicial="
					+ TurnoInicial + ", Nombre='" + Nombre + "', Patron='"
					+ Patron + "', DuracionCiclo=" + DuracionCiclo
					+ ", Salario=" + Salario + ", Tipo=" + Tipo
					+ " WHERE IdContrato=" + IdContrato + ";");
		} catch (SQLException e) {
			System.err.println("Database :: Error modificar contrato en la BD");
			return false;
		}
		return true;
	}
	
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#cambiarVentas(int, java.sql.Date, float)
	 */
	public boolean cambiarVentas(int IdVend, Date fecha, float ventas) {
		int r = 0;
		try {
			st = con.createStatement();
			r = st.executeUpdate("UPDATE " + tablaVentas + " SET Fecha='"
					+ fecha + "', Importe='" + ventas 
					+ "' WHERE NumVendedor=" + IdVend + ";");
		} catch (SQLException e) {
			System.err.println("Database :: Error modificar ventas en la BD");
			return false;
		}
		return true;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#cambiarEmpleado(int, java.lang.String, java.lang.String, java.lang.String, java.sql.Date, int, java.lang.String, java.lang.String, int, java.sql.Date, java.sql.Date, java.sql.Date, int, int, int, int, org.eclipse.swt.graphics.Color, int, int)
	 */
	public boolean cambiarEmpleado(int idEmp, String nomb, String Ape1, String Ape2, Date FNac, int sexo, 
			String mail, String Passw, int grupo, Date FCont, Date Fentr,Date FFinCont, int Felic, int Idiom, 
			int Rang, int Turn, Color color, int Contr, int pos) {
		int r = 0;
		String col =Util.ColorAHex(color);
		String Nac = Util.dateAString(FNac);
		String Cont = Util.dateAString(FCont);
		String Entr = Util.dateAString(Fentr);
		String ffin = Util.dateAString(FFinCont);
		if (FFinCont!=null) ffin = "'"+ffin+"'";
		String q = "UPDATE " + tablaUsuarios + " SET Nombre='"
		+ nomb + "', Apellido1='" + Ape1 + "', Apellido2='"
		+ Ape2 + "', FechaNacimiento='" + Nac
		+ "', Sexo=" + sexo + ", Email='" + mail
		+ "', Password='" + Passw + "', IndicadorGrupo=" + grupo
		+ ", FechaContrato='" + Cont + "', FechaEntrada='" + Entr
		+ "', Felicidad=" + Felic
		+ ", Idioma=" + Idiom + ", Rango=" + Rang
		+ ", IdContrato=" + Contr + ", IdTurno=" + Turn + ", Color='" + col + "', Posicion='" + pos
		+ "', FinContrato=" + ffin
		+ " WHERE NumVendedor=" + idEmp + ";";	
		try {
			st = con.createStatement();
			r = st.executeUpdate(q);
		} catch (SQLException e) {
			e.printStackTrace();
			System.err.println("Database :: Error al modificar empleado en la BD: " + q + "\n\t" + e.getMessage());
			return false;
		}
		return true;
	}
	
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#cambiarTurno(int, java.lang.String, java.lang.String, java.sql.Time, java.sql.Time, java.sql.Time, int, java.lang.String)
	 */
	public boolean cambiarTurno(int IdTurno, String Descripcion, String abreviatura, 
			Time HoraEntrada, Time HoraSalida, Time HoraInicioDescanso,
			int Duracion, String color) {
		int r = 0;
		Time tdesc = new Time(0);
		tdesc.setMinutes(Duracion);
		tdesc.setHours(0);
		String q = "UPDATE " + tablaTurnos + " SET "
		+ "Descripcion='" + Descripcion
		+ "', Abreviatura='" + abreviatura 
		+ "', HoraEntrada='" + HoraEntrada
		+ "', HoraSalida='" + HoraSalida
		+ "', HoraInicioDescanso='" + HoraInicioDescanso
		+ "', DuracionDescanso='" + tdesc + "', Color ='" + color + "'" + " WHERE IdTurno="
		+ IdTurno + ";";
		try {
			st = con.createStatement();
			r = st.executeUpdate(q);
		} catch (SQLException e) {
			System.err.println("Database :: Error modificar turno en la BD:\t" + q + "\n" + e.getMessage());
			return false;
		}
		return true;
	}
	
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#cerrarConexion()
	 */
	public void cerrarConexion() {
		try {
			if (con!=null) 
				con.close();
			System.out.println("aplicacion.Database.java\t:: Conexión cerrada correctamente");
		} catch (Exception e) {
			e.printStackTrace();
			System.err.println("aplicacion.Database.java\t:: Error cerrando la conexión: " + e.getMessage());
		}
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#conexionAbierta()
	 */
	public boolean conexionAbierta() {
		boolean b = false;
		try {
			if (con!=null) {
				Statement s = con.createStatement();
				s.execute("SELECT * FROM " + tablaUsuarios);
				s.close();
				b = !con.isClosed();
			}
		} catch (Exception e) {}
		return b;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#dameEmpleado(int)
	 */
	public ResultSet dameEmpleado(int nvend) {
		ResultSet r = null;
		try {
			st = con.createStatement();
			r = st.executeQuery("SELECT * FROM " + tablaUsuarios + " WHERE NumVendedor = "
					+ nvend);
		} catch (SQLException e) {
			System.err.println("Database :: Error al realizar la consulta del empleado ");
		}
		return r;
	}

	// como es autoincrementable he quitado el id
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#insertarContrato(int, java.lang.String, java.lang.String, int, double, int)
	 */
	public int insertarContrato(int turnoInicial, String nombre, String patron,
			int duracionCiclo, double salario, int tipocontrato) {
		int i = 0;
		ResultSet r = null;
		try {
			st = con.createStatement();
			st.executeUpdate("INSERT INTO " + tablaContratos + " (TurnoInicial,Nombre,Patron,DuracionCiclo,Salario,Tipo) values ("
							+ turnoInicial
							+ ", '"
							+ nombre
							+ "', '"
							+ patron
							+ "', "
							+ duracionCiclo
							+ ", "
							+ salario
							+ ", "
							+ tipocontrato + ");");
			//r = st.getGeneratedKeys();
			r = st.executeQuery("SELECT LAST_INSERT_ID()");
			if(r.next()) 
				i = r.getInt(1);
			else System.err.println("Error al obtener el identificador auto-generado");
		} catch (SQLException e) {
			i = -1;
			e.printStackTrace();
			System.err.println("Database :: Error al insertar el contrato");
		}
		return i;
	}
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#insertarContratoPorDepartamento(java.lang.String, int)
	 */
	public boolean insertarContratoPorDepartamento(String nombre, int idContrato) {
		boolean correcto = false;
		try {
			st = con.createStatement();
			st.executeUpdate("INSERT INTO " + tablaContratosPorDepartamento + " values ('" + nombre
					+ "', '" + idContrato + "')");
			correcto = true;
		} catch (SQLException e) {
			System.err.println("Database :: Error al insertar el contratodepartamento");
			correcto = false;
		}
		return correcto;
	}
	
	
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#insertarDepartamento(java.lang.String, int, java.sql.Time, java.sql.Time)
	 */
	public boolean insertarDepartamento(String nombre, int jefe,Time hI, Time hC) {
		boolean correcto = false;
		try {
			st = con.createStatement();
			st.executeUpdate("INSERT INTO " + tablaDepartamentos + " values ('" + nombre
					+ "', '" + jefe + "', '" + hI + "', '" + hC + "')");
			correcto = true;
		} catch (SQLException e) {
			System.err.println("Database :: Error al insertar el departamento");
			correcto = false;
		}
		return correcto;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#insertarDepartamentoUsuario(int, java.lang.String, boolean)
	 */
	public boolean insertarDepartamentoUsuario(int nvend, String nombre, boolean ultima) {
		boolean correcto = false;
		String q = "INSERT INTO " + tablaUsuariosPorDepartamento + " values ('"
		+ nvend + "', '" + nombre + "')";
		try {
			st.addBatch(q);
			if (ultima) {
				st.executeBatch();
			}
			correcto = true;
		} catch (SQLException e) {
			correcto = false;
			System.err.println("Database :: Error al insertar en DepartamentoUsuario");
			e.printStackTrace();
		}
		return correcto;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#insertarDistribucion(int, int, java.lang.String, int, int, java.lang.String, boolean)
	 */
	public boolean insertarDistribucion(int Hora, int DiaSemana, String Patron,
			int NumMax, int NumMin, String IdDepartamento, boolean ultima) {
		boolean correcto = false;
		String q = "INSERT INTO " + tablaDistribucionHorarios + " values ('" + Hora
		+ "', '" + DiaSemana + "', '" + Patron + "', '" + NumMax
		+ "', '" + NumMin + "', '" + IdDepartamento + "')";
		try {
			st.addBatch(q);
			if (ultima) {
				st.executeBatch();
			}
			correcto = true;
		} catch (SQLException e) {
			correcto = false;
			System.err.println("Database :: Error al insertar Distribución:\n\t" + q);
			e.printStackTrace();
		}
		return correcto;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#insertarFestivo(int, java.sql.Date, java.lang.String, int, int, java.lang.String, boolean)
	 */
	public boolean insertarFestivo(int Hora, Date Fecha, String Patron,
			int NumMax, int NumMin, String IdDepartamento, boolean ultima) {
		boolean correcto = false;
		String q = "INSERT INTO " + tablaFestivos + " values ('" + Hora
		+ "', '" + Fecha + "', '" + Patron + "', '" + NumMax
		+ "', '" + NumMin + "', '" + IdDepartamento + "')";
		try {
			st.addBatch(q);
			if (ultima) {
				st.executeBatch();
			}
			correcto = true;
		} catch (SQLException e) {
			correcto = false;
			System.err.println("Database :: Error al insertar Festivo:\n\t" + q);
			e.printStackTrace();
		}
		return correcto;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#insertarIncidencia(java.lang.String)
	 */
	public boolean insertarIncidencia(String descripcion) {
		boolean correcto = false;
		try {
			st = con.createStatement();
			st.executeUpdate("INSERT INTO " + tablaIncidencias + " values (" + 0 + ", '"
					+ descripcion + "');");
			correcto = true;
		} catch (SQLException e) {
			correcto = false;
			System.err.println("Database :: Error al insertar la incidencia");
		}
		return correcto;
	}
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#insertarIssue(java.lang.String)
	 */
	public void insertarIssue(String texto) {
		try {
			abrirConexion();
			st = con.createStatement();
			st.executeUpdate("INSERT INTO " + tablaIssues + " (text) values ( '" + texto + "');");
		} catch (SQLException e) {
			e.printStackTrace();
			System.err.println("Database :: Error al insertar el issue");
		}
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#insertarListaDestinatarios(int, int)
	 */
	public boolean insertarListaDestinatarios(int numVendedor, int idMensaje) {
		boolean correcto = false;
		try {
			st = con.createStatement();
			st.executeUpdate("INSERT INTO " + tablaDestinatariosMensaje + " values (" + numVendedor
					+ ", " + idMensaje + ");");
			System.out
					.println("aplicacion.Database.java\t::Destinatario insertado");
			correcto = true;
		} catch (SQLException e) {
			correcto = false;
			System.err.println("Database :: Error al insertar en ListaDestinatarios");
		}
		return correcto;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#insertarMensaje(int, java.sql.Date, java.lang.String, java.lang.String, boolean, boolean)
	 */
	// como es autoincrementable se ha quitado el id
	public int insertarMensaje(int remitente, Date fecha, String asunto,
			String texto, boolean marcado, boolean visto) {
		int i = 0;
		ResultSet r = null;
		java.sql.Timestamp ts = new java.sql.Timestamp(fecha.getTime());
		try {
			st = con.createStatement();
			st.executeUpdate("INSERT INTO " + tablaMensajes + " (Remitente, Fecha, Asunto, Texto, Marcado, visto) values ( "
							+ remitente
							+ ", '"
							+ ts
							+ "', '"
							+ asunto
							+ "', '" + texto + "', " + marcado + ", " + visto + ");");
//			System.out.println("aplicacion.Database.java\t::Mensaje insertado");
			//r = st.getGeneratedKeys();
			r = st.executeQuery("SELECT LAST_INSERT_ID()");
			if(r.next()) 
				i = r.getInt(1);
			else System.err.println("Database :: Error al obtener el identificador auto-generado");
		} catch (SQLException e) {
			i = -1;
			e.printStackTrace();
			System.err.println("Database :: Error al insertar el mensaje");
		}
		return i;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#insertarNumerosDepartamento(int, java.lang.String)
	 */
	public boolean insertarNumerosDepartamento(int numero, String nombre) {
		boolean correcto = false;
		try {
			st = con.createStatement();
			st.executeUpdate("INSERT INTO " + tablaNumerosPorDepartamento + " values ('"
					+ nombre + "', '" + numero + "')");
			System.out
					.println("aplicacion.Database.java\t::Departamento insertado");
			correcto = true;
		} catch (SQLException e) {
			System.err.println("Database :: Error al insertar en NumerosDepartamento");
			correcto = false;
		}
		return correcto;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#insertarTieneIncidencia(int, int, java.sql.Time, java.sql.Time)
	 */
	public boolean insertarTieneIncidencia(int idIncidencia, int numVendedor,
			Time fechaInicio, Time fechaFin) {
		boolean correcto = false;
		try {
			st = con.createStatement();
			st.executeUpdate("INSERT INTO " + tablaIncidenciasPorUsuario + " values ("
					+ idIncidencia + ", " + numVendedor + ", '" + fechaInicio
					+ "','" + fechaFin + "');");
			System.out
					.println("aplicacion.Database.java\t::incidencia de una persona insertada");
			correcto = true;
		} catch (SQLException e) {
			correcto = false;
			System.err.println("Database :: Error al insertar la ListaTurnosPorContrato");
		}
		return correcto;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#insertarTrabaja(int, int, java.lang.String, java.sql.Time, java.sql.Time, boolean)
	 */
	public boolean insertarTrabaja(int numVendedor, int idTurno, String fecha,
			Time horaEntrada, Time horaSalida, boolean ultima) {
		boolean correcto = false;
		try {
			st.addBatch("INSERT INTO " + tablaTrabaja + " values (" + numVendedor
					+ ", " + idTurno + ", '" + fecha + "', '" + horaEntrada
					+ "', '" + horaSalida + "');");
			if (ultima){
				st.executeBatch();
			}
			correcto = true;
		} catch (SQLException e) {
			correcto = false;
			System.err.println("Database :: Error al insertar en Trabaja");
		}
		return correcto;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#modificarTrabaja(int, int, java.lang.String)
	 */
	public boolean modificarTrabaja(int numVendedor, int idTurno, String fecha) {
		boolean correcto = false;
		// Actualizar el cuadrante
		String q1 = "UPDATE " + tablaTrabaja + " SET IdTurno = "
				+ idTurno 
				+ " WHERE NumVendedor = " + numVendedor + " AND "  
				+ " Fecha = '" + fecha + "';";
		// Eliminar los turnos temporales que se hubieran creado para este vendedor y esta fecha
		String q2 = "DELETE FROM "+ tablaTurnos +" WHERE Descripcion = 'TE-" + numVendedor + "@" + fecha + "' " +
				"AND IdTurno != " + idTurno + ";\n";

		try {
			st = con.createStatement();
			st.addBatch(q1);
			st.addBatch(q2);
			st.executeBatch();
			correcto = true;
		} catch (SQLException e) {
			correcto = false;
			System.err.println("Database :: Error al modificar en Trabaja\n\t" + q1 + "\n\t" + q2 + "\n\t" + e.getMessage());
		}
		return correcto;
	}

	
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#insertarCuadrante(algoritmo.Cuadrante)
	 */
	public boolean insertarCuadrante(Cuadrante cuadrante) {
		boolean correcto = false;
		String q = "INSERT INTO " + tablaTrabaja + " values \n";
		String an, me, di, fecha; int d;
		for (int dia = 0; dia < cuadrante.getNumDias(); dia++) {
			ArrayList<Trabaja> cuad = cuadrante.getListaTrabajaDia(dia);
			for (int i = 0; i < cuad.size(); i++) {
				Trabaja trabaja = cuad.get(i);
				an = "" + cuadrante.getAnio();
				if (an.length()==1)
					an = "0" + an;
				
				me = "" + cuadrante.getMes();
				if (me.length()==1)
					me = "0" + me;
				d = dia + 1;
				di = "" + d;
				if (di.length()==1)
					di = "0" + di;
				fecha = an + "-" + me + "-" + di;

				q += "(" + 
					"'" + trabaja.getIdEmpl() + "', " +
					"'" + trabaja.getIdTurno() + "', " +
					"'" + fecha + "', " +
					"'" + trabaja.getFichIni() + "', " +
					"'" + trabaja.getFichFin() + "')";
				if (dia<cuadrante.getNumDias()-1 || i<cuad.size()-1)
					q += ",\n";
			}
		}
		//Quitar coma y el salto de linea al final, si los hay
		if (q.charAt(q.length()-2)==',')
			q=q.substring(0, q.length()-2);
		try {
			st.executeUpdate(q);
			correcto = true;
		} catch (SQLException e) {
			correcto = false;
			System.err.println("Database :: Error al insertar en Cuadrante:\n" + q);
			e.printStackTrace();
		}
		return correcto;	
	}
	
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#insertarSugerencia(java.sql.Date, java.sql.Time, java.lang.String, java.lang.String)
	 */
	public boolean insertarSugerencia (Date fecha, Time horaInicio, String nombre, String texto) {
		boolean correcto = false;
		String q = "INSERT INTO " + tablaSugerencias + " values ('" + nombre 
		+ "', '" + fecha + "', '" + horaInicio + "', '" + texto + "');";
		try {
			st.executeUpdate(q);
			correcto = true;
		} catch (SQLException e) {
			correcto = false;
			System.err.println("Database :: Error al insertar en Sugerencias:\n\tConsulta: " + q + "\n\tError: " + e.getMessage());
		}
		return correcto;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#executeBatch()
	 */
	public boolean executeBatch() {
		try {
			st.executeBatch();
//			st.close();
		} catch (SQLException e) {
			System.err.println("Database :: Error al ejecutar batch SQL: " + e.getMessage());
		}
		return true;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#insertarTurno(java.lang.String, java.lang.String, java.sql.Time, java.sql.Time, java.sql.Time, int, java.lang.String)
	 */
	// como es autoincrementable he quitado el id
	public int insertarTurno(String Descripcion, String abreviatura, Time HoraEntrada,
			Time HoraSalida, Time HoraInicioDescanso, int Duracion, String color) {
		int i = -1;
		ResultSet r = null;
		try {
			Time tdesc = new Time(0);
			tdesc.setMinutes(Duracion);
			tdesc.setHours(0);
			st = con.createStatement();
			st.executeUpdate("INSERT INTO " + tablaTurnos + " (Descripcion, Abreviatura, HoraEntrada, HoraSalida, HoraInicioDescanso, DuracionDescanso, Color) VALUES ('"
							+ Descripcion
							+ "', '"
							+ abreviatura
							+ "', '"
							+ HoraEntrada
							+ "', '"
							+ HoraSalida
							+ "', '"
							+ HoraInicioDescanso
							+ "', '"
							+ tdesc 
							+ "', '"
							+ color + "')");
//			System.out.println("aplicacion.Database.java\t::Turno insertado");
			//r = st.getGeneratedKeys();
			r = st.executeQuery("SELECT LAST_INSERT_ID()");
			if(r.next()) 
				i = r.getInt(1);
			else System.err.println("Database :: Error al obtener el identificador auto-generado");
		} catch (SQLException e) {
			i = -1;
			e.printStackTrace();
			System.err.println("Database :: Error al insertar el Turno");
		}
		return i;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#insertarTurnoPorContrato(int, int)
	 */
	public boolean insertarTurnoPorContrato(int idTurno, int idContrato) {
		boolean correcto = false;
		try {
			st = con.createStatement();
			st.executeUpdate("INSERT INTO " + tablaTurnosPorContrato + " values ("
					+ idTurno + ", " + idContrato + ");");
			correcto = true;
		} catch (SQLException e) {
			correcto = false;
			e.printStackTrace();
			System.err.println("Database :: Error al insertar enListaTurnosPorContrato");
		}
		return correcto;
	}
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#insertarUsuario(int, java.lang.String, java.lang.String, java.lang.String, java.sql.Date, int, java.lang.String, java.lang.String, int, java.sql.Date, java.sql.Date, int, int, int, int, int, int, java.lang.String, java.lang.String, java.lang.String, boolean, java.sql.Date, int, java.sql.Date)
	 */
	public boolean insertarUsuario(int id, String nombre, String apellido1,
			String apellido2, Date fechaNac, int sexo, String email,
			String password, int indicadorGrupo, Date fechaContrato,
			Date fechaEntrada, int horasExtras, int felicidad, int idioma,
			int rango, int idContrato, int idTurno, String Color, String Telefono,
			String Ssid, boolean HaEntrado, Date UltimoAcceso, int posicion, Date finContrato) {
		boolean correcto = false;
		String q = "";
		if (finContrato == null) {
			q = "INSERT INTO " + tablaUsuarios + " values (" + id + ", '"
			+ nombre + "', '" + apellido1 + "' ,'" + apellido2 + "','"
			+ fechaNac + "'," + sexo + ",'" + email + "','"
			+ password + "'," + indicadorGrupo + ",'" + fechaContrato
			+ "','" + fechaEntrada + "'," + horasExtras + ","
			+ felicidad + "," + idioma + "," + rango + ","
			+ idContrato + "," + idTurno + ",'" + Color + "','"
			+ Telefono + "','" + Ssid + "'," + HaEntrado + ",'" + UltimoAcceso + "', " + posicion + ",NULL)";
		} else {
			q = "INSERT INTO " + tablaUsuarios + " values (" + id + ", '"
			+ nombre + "', '" + apellido1 + "' ,'" + apellido2 + "','"
			+ fechaNac + "'," + sexo + ",'" + email + "','"
			+ password + "'," + indicadorGrupo + ",'" + fechaContrato
			+ "','" + fechaEntrada + "'," + horasExtras + ","
			+ felicidad + "," + idioma + "," + rango + ","
			+ idContrato + "," + idTurno + ",'" + Color + "','"
			+ Telefono + "','" + Ssid + "'," + HaEntrado + ",'" + UltimoAcceso + "', " + posicion + ",'" + finContrato + "')";
		}
		try {
			st = con.createStatement();
			st.executeUpdate(q);
			correcto = true;
		} catch (SQLException e) {
			System.err.println("Database :: Error al insertar Usuario: " + q);
			e.printStackTrace();
			correcto = false;
		}
		return correcto;
	}
	
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#insertarVentas(int, java.sql.Date, float)
	 */

	public boolean insertarVentas(int idUsuario, Date Fecha, float numVentas) {
		boolean correcto = false;
		try {
			st = con.createStatement();
			st.executeUpdate("INSERT INTO " + tablaVentas + " values ('" + idUsuario + "', '"
					+ Fecha + "', '" + numVentas + "')");
//			System.out.println("aplicacion.Database.java\t::Ventas insertada");
			correcto = true;
		} catch (SQLException e) {
			correcto = false;
			e.printStackTrace();
			System.err.println("Database :: Error al insertar Ventas");
		}
		return correcto;

	}
	
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#marcaMensaje(boolean, int)
	 */
	public boolean marcaMensaje(boolean marca, int id) {
		boolean correcto = false;
		try {
			st = con.createStatement();
			st.executeUpdate("UPDATE " + tablaMensajes + " SET Marcado= " + marca
					+ " WHERE IdMensaje=" + id);
			correcto = true;
		} catch (SQLException e) {
			correcto = false;
			System.err.println("Database :: Error al Marcar el mensaje");
		}
		return correcto;
	}
	
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#marcaMensajeLeido(boolean, int)
	 */
	public boolean marcaMensajeLeido(boolean marca, int id) {
		boolean correcto = false;
		try {
			st = con.createStatement();
			st.executeUpdate("UPDATE " + tablaMensajes + " SET visto= " + marca
					+ " WHERE IdMensaje=" + id);
			correcto = true;
		} catch (SQLException e) {
			correcto = false;
			System.err.println("Database :: Error al Marcar el mensaje");
		}
		return correcto;
	}
	

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#modificaDepartamento(java.lang.String, int)
	 */
	public boolean modificaDepartamento(String Nombre, int nvend) {
		int r = 0;
		try {
			st = con.createStatement();
			r = st.executeUpdate("UPDATE " + tablaDepartamentos + " SET JefeDepartamento='"
					+ nvend + "'" + "WHERE Nombre='" + Nombre + "';");
		} catch (SQLException e) {
			e.printStackTrace();
			System.err.println("Database :: Error Cambiar Jefe de Dpto en la BD");
			return false;
		}
		return true;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#modificaHorarioDepartamento(java.lang.String, java.sql.Time, java.sql.Time)
	 */
	public boolean modificaHorarioDepartamento(String Nombre, Time hI, Time hC) {
		int r = 0;
		try {
			st = con.createStatement();
			r = st.executeUpdate("UPDATE " + tablaDepartamentos + " SET HoraApertura='"
					+ hI +"'"+ ", HoraCierre='"+hC+"'"+ "WHERE Nombre='" + Nombre + "';");
			
		} catch (SQLException e) {
			e.printStackTrace();
			System.err.println("Database :: Error Cambiar Jefe de Dpto en la BD");
			return false;
		}
		return true;
	}
	
	
	
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenContrato(int)
	 */
	public ResultSet obtenContrato(int idContrato) {
		ResultSet result = null;
		try {
			st = con.createStatement();
			result = st
					.executeQuery("SELECT * FROM " + tablaContratos + " WHERE IdContrato = "
							+ idContrato + ";");
		} catch (SQLException e) {
			System.err.println("Database :: Error de lectura de Contrato");
		}
		return result;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenVentas(int, java.sql.Date)
	 */
	public ResultSet obtenVentas(int idVend,Date fecha){
		ResultSet result =null;
		try{
			st=con.createStatement();
			result = st
			.executeQuery("SELECT * FROM " + tablaVentas + " WHERE NumVendedor = "
					+ idVend +  " AND Fecha='"+ fecha + "';");
		} catch (SQLException e) {
			e.printStackTrace();
			System.err.println("Database :: Error de lectura de Ventas");
		}
		return result;
		
	}
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenVentasAnio(int, int)
	 */
	public ResultSet obtenVentasAnio(int vend, int anio) {
		ResultSet rs = null;
		try {
			String inicio = anio + "-01-01";
			String fin = anio + "-12-31";
			st = con.createStatement();
			rs = st.executeQuery("SELECT * FROM " + tablaVentas + 
					" WHERE NumVendedor = " + vend + " AND Fecha >= '" + inicio + "' AND Fecha <= '" + fin +
					"' ORDER BY Fecha ASC;");
		} catch (SQLException e) {
			e.printStackTrace();
			System.err.println("Database :: Error de lectura de Ventas Anuales");
		}
		
		return rs;
	}
	
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenVentasJefeAnio(int[], int)
	 */
	public ResultSet obtenVentasJefeAnio(int[] vendedores, int anio) {
		ResultSet rs = null;
		try {
			String inicio = anio + "-01-01";
			String fin = anio + "-12-31";			
			String sql = "";
			
			for (int i=0; i<vendedores.length-1; i++)
				sql += "SELECT * FROM " + tablaVentas + " WHERE NumVendedor = " + vendedores[i] +
				" AND Fecha >= '" + inicio + "' AND Fecha <= '" + fin + "' UNION ";
			
			sql += "SELECT * FROM " + tablaVentas + " WHERE NumVendedor = " + vendedores[vendedores.length-1] +
			" AND Fecha >= '" + inicio + "' AND Fecha <= '" + fin +	"' ORDER BY Fecha ASC;";
			
			st = con.createStatement();
			rs = st.executeQuery(sql);
		} catch (SQLException e) {
			e.printStackTrace();
			System.err.println("Database :: Error de lectura de Ventas Anuales");
		}
		
		return rs;
	}
	
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenContratosDepartamento(java.lang.String)
	 */
	public ResultSet obtenContratosDepartamento(String departamento) {
		ResultSet r = null;

		String q = "SELECT * FROM " + tablaContratosPorDepartamento + " JOIN " + tablaContratos +
		" WHERE " + tablaContratosPorDepartamento + ".NombreDept='"+ departamento 
		+ "' AND " + tablaContratosPorDepartamento + ".IdContrato = " + tablaContratos + ".IdContrato;";
		try {
			st = con.createStatement();
			r = st.executeQuery(q);
			
		} catch (SQLException e) {
			e.printStackTrace();
			System.err.println("Database :: Error al realizar la consulta de contratos de un departamento:\n\t" + q);
		}
		return r;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenCuadrante(int, int)
	 */
	public ResultSet obtenCuadrante(int mes, int anio) {
		ResultSet r = null;

		try {
			String inicio = anio + "-" + mes + "-" + "1";
			String fin = anio + "-" + mes + "-" + "31";
			st = con.createStatement();
			r = st.executeQuery("SELECT * FROM " + tablaTrabaja + " WHERE Fecha>='" + inicio
					+ "' AND Fecha<='" + fin + "';");
		} catch (SQLException e) {
			System.err
					.println("Database :: Error al realizar la consulta en departamento ");
		}
		return r;
	}
	
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenCuadrante(int, int, java.lang.String)
	 */
	public ResultSet obtenCuadrante(int mes, int anio, String departamento) {
		ResultSet r = null;
		try {
			String inicio = anio + "-" + mes + "-" + "01";
			String fin = anio + "-" + mes + "-" + "31";
			st = con.createStatement();

			// SELECT * FROM Trabaja
			// WHERE Fecha>= 'inicio' AND Fecha<= 'fin'
			// AND NumVendedor IN (
			//		SELECT NumVendedor FROM DepartamentoUsuario
			//		WHERE NombreDepartamento = 'departamento');
			
			r = st.executeQuery("SELECT * FROM " + tablaTrabaja + " WHERE Fecha>='" + inicio
					+ "' AND Fecha<='" + fin + "' AND NumVendedor IN (" +
							"SELECT NumVendedor FROM " + tablaUsuariosPorDepartamento + " WHERE " +
							"NombreDepartamento = '"+ departamento +"');");
		} catch (SQLException e) {
			System.err.println("Database :: Error al realizar la consulta de cuadrantes");
		}
		return r;
	}
	
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenDepartamento(java.lang.String)
	 */
	public ResultSet obtenDepartamento(String nombre) {
		ResultSet r = null;

		try {
			st = con.createStatement();
			r = st.executeQuery("SELECT * FROM " + tablaDepartamentos + " WHERE Nombre='"
					+ nombre + "'");
		}

		catch (SQLException e) {
			System.err
					.println("Database :: Error al realizar la consulta en departamento ");
		}
		return r;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenDepartamentosJefe(int)
	 */
	public ResultSet obtenDepartamentosJefe(int nvend) {
		ResultSet r = null;
		String q = "SELECT Nombre FROM " + tablaDepartamentos + " WHERE JefeDepartamento = " + nvend;
		try {
			st = con.createStatement();
			r = st.executeQuery(q);
		} catch (SQLException e) {
			System.err.println("Database :: Error al realizar la consulta de los ids departamentos:\n\t" + q);
		}
		return r;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenDestinatarios(int)
	 */
	public ResultSet obtenDestinatarios(int idUsuario) {
		ResultSet result = null;
		try {
			st = con.createStatement();
			result = st
					.executeQuery("SELECT IdMensaje from " + tablaDestinatariosMensaje + " WHERE NumVendedor = "
							+ idUsuario + ";");
		} catch (SQLException e) {
			System.err.println("Database :: Error obtenDestinatarios");
		}
		return result;

	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenDistribucion(java.lang.String, int)
	 */
	public ResultSet obtenDistribucion(String nombre, int DiaSemana) {

		try {
			st = con.createStatement();
			String q="SELECT * FROM "+tablaDistribucionHorarios+" WHERE NombreDept='"+nombre+"' AND DiaSemana="+DiaSemana+" ORDER BY Hora ASC";
			rs = st.executeQuery(q);		

		} catch (SQLException e) {
			System.err.println("Database :: Error al realizar la consulta de la distribucion ");
		}
		return rs;
	}
	
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenSugerenciasMes(int, int, java.lang.String)
	 */
	public ResultSet obtenSugerenciasMes(int mes, int anio, String dep) {
		try {
			String fechaIni = anio + "-" + mes + "-" + 1;
			String fechaFin = anio + "-" + mes + "-" + Util.dameDias(mes, anio);
			st = con.createStatement();
			rs = st.executeQuery("SELECT * FROM " + tablaSugerencias + " WHERE NombreDept ='"
							+ dep
							+ "' AND Fecha >='"
							+ fechaIni
							+ "' AND Fecha <='"
							+ fechaFin + "'");

		} catch (SQLException e) {
			System.err.println("Database :: Error al realizar la consulta de la sugerencia ");
		}
		return rs;
	}
	
	
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#borraDistribucion(java.lang.String, int)
	 */
	public boolean borraDistribucion(String nombre, int DiaSemana) {
		boolean correcto = false ;
		
		try {
			st = con.createStatement();
			st.executeUpdate("DELETE FROM " + tablaDistribucionHorarios + " WHERE NombreDept ='"
							+ nombre
							+ "' AND DiaSemana="
							+ DiaSemana);
			return true;
		} catch(SQLException e) {
			e.printStackTrace();
			System.err.println("Database :: Error al borrar la distribucion ");
		}
		
		return correcto;
	}
	
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#setDistribucion(java.lang.String, int, java.lang.Object[], boolean)
	 */
	public boolean setDistribucion(String nombre, int DiaSemana, Object[] datos, boolean ultimo) {
		boolean correcto = false ;
		try {			
			st.addBatch("INSERT INTO " + tablaDistribucionHorarios + " VALUES (" + (Integer)datos[0] + ", "
					+ DiaSemana + ", '"
					+ (String)datos[3] + "', "
					+ (Integer)datos[2] + ", "
					+ (Integer)datos[1] + ", '"
					+ nombre + "');");
			
			if (ultimo)
				st.executeBatch();
			
			correcto=true;
		} catch (SQLException e) {
			e.printStackTrace();
			System.err.println("Database :: Error al insertar la distribucion ");
		}
		return correcto;
	}
	
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#setFestivo(java.lang.String, java.sql.Date, java.lang.Object[], boolean)
	 */
	public boolean setFestivo(String nombre, Date Fecha, Object[] datos, boolean ultimo) {
		boolean correcto = false ;
		try {
			st.addBatch("INSERT INTO " + tablaFestivos + " VALUES (" + (Integer)datos[0] + ", '"
					+ Fecha + "', '"
					+ (String)datos[3] + "', "
					+ (Integer)datos[2] + ", "
					+ (Integer)datos[1] + ", '"
					+ nombre + "');");
			
			if (ultimo)
				st.executeBatch();
			
			correcto=true;
		} catch (SQLException e) {
			e.printStackTrace();
			System.err.println("Database :: Error al insertar el festivo ");
		}
		return correcto;
	}
	
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#borraFestivo(java.lang.String, java.sql.Date)
	 */
	public boolean borraFestivo(String nombre, Date Fecha) {
		boolean correcto = false ;
		
		try {
			st = con.createStatement();
			st.executeUpdate("DELETE FROM " + tablaFestivos + " WHERE NombreDept ='"
							+ nombre
							+ "' AND Fecha='"
							+ Fecha + "'");
			return true;
		} catch(SQLException e) {
			e.printStackTrace();
			System.err.println("Database :: Error al borrar el festivo ");
		}
		
		return correcto;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenDistribuciones(java.lang.String)
	 */
	public ResultSet obtenDistribuciones(String nombre) {

		try {
			st = con.createStatement();
			rs = st
					.executeQuery("SELECT * FROM " + tablaDistribucionHorarios + " WHERE NombreDept ='"
							+ nombre
							+ " ORDER BY Hora ASC");

		} catch (SQLException e) {
			System.err
					.println("Database :: Error al realizar la consulta de las distribuciones ");
		}
		return rs;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenEmpleadoAlaCarta(java.lang.Integer, java.lang.String, java.lang.Integer, java.lang.String, java.lang.String, java.lang.String, java.lang.Integer)
	 */
	public ResultSet obtenEmpleadoAlaCarta(Integer idEmpl, String idDpto,
			Integer idContrato, String nombre, String apellido1,
			String apellido2, Integer rango) {
		ResultSet r = null;
		String subconsulta;
		boolean to2null = true;
		String consulta = "SELECT * FROM " + tablaUsuarios + " WHERE ";
		int numero = 0;
		if (idEmpl != null) {
			consulta += "NumVendedor= " + idEmpl;
			to2null = false;
			numero = 1;
		}
		if (idContrato != null) {
			if (numero == 0)
				consulta += "IdContrato= " + idContrato;
			else
				consulta += " and IdContrato= " + idContrato;
			to2null = false;
			numero = 1;
		}
		if (nombre != null) {
			if (numero == 0)
				consulta += "Nombre= '" + nombre + "'";
			else
				consulta += " and Nombre= '" + nombre + "'";
			to2null = false;
			numero = 1;
		}
		if (apellido1 != null) {
			if (numero == 0)
				consulta += "Apellido1= '" + apellido1 + "'";
			else
				consulta += " and Apellido1= '" + apellido1 + "'";
			to2null = false;
			numero = 1;
		}
		if (apellido2 != null) {
			if (numero == 0)
				consulta += "Apellido2= '" + apellido2 + "'";
			else
				consulta += " and Apellido2= '" + apellido2 + "'";
			to2null = false;
			numero = 1;
		}
		if (rango != null) {
			if (numero == 0)
				consulta += "Rango= " + rango;
			else
				consulta += " and Rango= " + rango;
			to2null = false;
			numero = 1;
		}
		if (idDpto != null) {
			subconsulta = "SELECT NumVendedor FROM " + tablaUsuariosPorDepartamento + " WHERE NombreDepartamento= '"
					+ idDpto + "'";
			to2null = false;
			if (numero == 0)
				consulta += "NumVendedor IN (" + subconsulta + ")";
			else
				consulta += " and NumVendedor IN (" + subconsulta + ")";
		}
		try {
			st = con.createStatement();
			if (to2null) {
				r = st.executeQuery("SELECT * FROM " + tablaUsuarios + "");
			} else
				r = st.executeQuery(consulta);
		} catch (Exception e) {
			System.err
					.println("Database :: Error al realizar la consulta del empleado a la carta");
		}
		return r;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenEmpleadosDepartamento(java.lang.String)
	 */
	public ResultSet obtenEmpleadosDepartamento(String nombre) {
		ResultSet r = null;
		String consulta = "SELECT NumVendedor FROM " + tablaUsuariosPorDepartamento + " WHERE NombreDepartamento ='"
				+ nombre + "'";
		try {
			st = con.createStatement();
			r = st.executeQuery(consulta);
		} catch (SQLException e) {
			System.err
					.println("Database :: Error al obtener los empleados de un departamento ");
		}
		return r;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenFestivos(java.lang.String, java.sql.Date)
	 */
	public ResultSet obtenFestivos(String nombre, Date Fecha) {
		try {
			st = con.createStatement();
			rs = st.executeQuery("SELECT * FROM " + tablaFestivos + " WHERE NombreDept ='"
					+ nombre + "' AND Fecha='" + Fecha
					+ "' ORDER BY Hora ASC");

		} catch (SQLException e) {
			e.printStackTrace();
			System.err
					.println("Database :: Error al realizar la consulta de los festivos ");
		}
		return rs;
	}
	
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenFestivosFecha(java.lang.String, java.sql.Date)
	 */
	public ResultSet obtenFestivosFecha(String nombre, Date Fecha) {
		try {
			st = con.createStatement();
			rs = st.executeQuery("SELECT DISTINCT Fecha FROM " + tablaFestivos + " WHERE NombreDept ='"
					+ nombre + "' AND Fecha>='" + Fecha
					+ "' ");

		} catch (SQLException e) {
			e.printStackTrace();
			System.err
					.println("Database :: Error al realizar la consulta de los festivos ");
		}
		return rs;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenFestivosMes(java.lang.String, int, int)
	 */
	public ResultSet obtenFestivosMes(String nombre, int anio, int mes) {
		String FechaInicio = anio+mes+"1";
		String FechaFin = anio+mes+Integer.toString(Util.dameDias(mes, anio));
		
		try {
			st = con.createStatement();
			rs = st.executeQuery("SELECT * FROM " + tablaFestivos + " WHERE NombreDept ='"
					+ nombre + "' AND Fecha>='" + FechaInicio
					+ "' AND Fecha<='" + FechaFin + "' ORDER BY Hora ASC");

		} catch (SQLException e) {
			e.printStackTrace();
			System.err
					.println("Database :: Error al realizar la consulta de los festivos ");
		}
		return rs;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenHorarioDpto(java.lang.String)
	 */
	public ResultSet obtenHorarioDpto(String dpto) {
		ResultSet r = null;
		try {
			st = con.createStatement();
			r = st.executeQuery("SELECT HoraApertura, HoraCierre FROM "+tablaDepartamentos+" WHERE Nombre='"+dpto+"';");
		} catch (SQLException e) {
			System.err.println("Database :: Error al realizar la consulta del horario de un Dpto");
		}
		return r;
	}
	
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#setHorarioDpto(java.lang.String, java.sql.Time, java.sql.Time)
	 */
	public boolean setHorarioDpto(String dpto, Time entrada, Time salida) {
		boolean correcto = false;
		try {
			st = con.createStatement();
			st.executeUpdate("UPDATE " + tablaDepartamentos + " SET HoraApertura = '" + entrada + "', HoraCierre = '" + salida + "' WHERE Nombre='" + dpto + "';");
			
			correcto = true;
		} catch (SQLException e) {
			System.err.println("Database :: Error al realizar la consulta del horario de un Dpto");
		}
		return correcto;
	}	

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenHorasTrabajoEmpleadoDia(int, int, java.sql.Date)
	 */
	public ResultSet obtenHorasTrabajoEmpleadoDia(int nv,int idturno,Date d) {
		ResultSet r = null;
		try {
			st = con.createStatement();
			r = st.executeQuery("SELECT HoraEntrada, HoraSalida FROM " + tablaTrabaja + " WHERE NumVendedor='"+nv+"' AND Fecha='"+d+"' AND IdTurno='"+idturno+"';");
		} catch (SQLException e) {
			System.err.println("Database :: Error al realizar la consulta de Horario del Jefe del Dpto");
		}
		return r;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenIdMensaje()
	 */
	public int obtenIdMensaje() {
		ResultSet result = null;
		int maximo = -1;
		try {
			st = con.createStatement();
			result = st
					.executeQuery("SELECT Max(IdMensaje)as Maximo from " + tablaMensajes + ";");
			result.next();
			maximo = result.getInt("Maximo");
		} catch (SQLException e) {
			System.err.println("Database :: Error al obtener el maximo id de los mensajes");
		}
		return maximo;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenIdsDepartamentos(int)
	 */
	public ResultSet obtenIdsDepartamentos(int nvend) {
		ResultSet r = null;
		String q = "SELECT NombreDepartamento FROM " + tablaUsuariosPorDepartamento + " WHERE NumVendedor = " + nvend;
		try {
			st = con.createStatement();
			r = st.executeQuery(q);
		} catch (SQLException e) {
			System.err.println("Database :: Error al realizar la consulta de los ids departamentos:\n\t" + q);
		}
		return r;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenIdsSubordinados(int)
	 */
	public ResultSet obtenIdsSubordinados(int nvend) {
		ResultSet r = null;
		try {
			st = con.createStatement();
			r = st.executeQuery("SELECT NumVendedor FROM " + tablaUsuariosPorDepartamento + ", " + tablaDepartamentos + " WHERE JefeDepartamento = "
							+ nvend
							+ " and " + tablaDepartamentos + ".Nombre=NombreDepartamento");
		} catch (SQLException e) {
			System.err.println("Database :: Error al realizar la consulta de los subordinados ");
		}
		return r;
	}
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenJefedeDepartamento(java.lang.String)
	 */
	public ResultSet obtenJefedeDepartamento(String nombreDep) {
		ResultSet r = null;
		try {
			st = con.createStatement();
			r = st.executeQuery("SELECT JefeDepartamento FROM " + tablaDepartamentos + " WHERE Nombre='"+nombreDep+"';");
		} catch (SQLException e) {
			System.err.println("Database :: Error al realizar la consulta del Jefe del Dpto");
		}
		return r;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenListaEmpleadosDepartamento(java.lang.String)
	 */
	public ResultSet obtenListaEmpleadosDepartamento(String departamento) {
		ResultSet r = null;
		try {
			st = con.createStatement();

			// SELECT * FROM " + tablaUsuarios + "
			// WHERE  NumVendedor IN (
			//		SELECT NumVendedor FROM DepartamentoUsuario
			//		WHERE NombreDepartamento = 'departamento');
			
			r = st.executeQuery("SELECT * FROM " + tablaUsuarios+ " WHERE NumVendedor IN (" +
							"SELECT NumVendedor FROM " + tablaUsuariosPorDepartamento + " WHERE " +
							"NombreDepartamento = '"+ departamento +"');");
			
		} catch (SQLException e) {
			System.err.println("Database :: Error al realizar la consulta de empleados");
		}
		return r;
	}
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenListaEmpleadosSinJefeDepartamento(java.lang.String)
	 */
	public ResultSet obtenListaEmpleadosSinJefeDepartamento(String departamento) {
		ResultSet r = null;
		try {
			st = con.createStatement();

			// SELECT * FROM " + tablaUsuarios+ "
			// WHERE  NumVendedor IN (
			//		SELECT NumVendedor FROM " + tablaUsuariosPorDepartamento + "
			//		WHERE NombreDepartamento = 'departamento');
			
			r = st.executeQuery("SELECT * FROM " + tablaUsuarios+ " WHERE NumVendedor IN (" +
							"SELECT NumVendedor FROM " + tablaUsuariosPorDepartamento + " WHERE " +
							"NombreDepartamento = '"+ departamento +"');");
			
		} catch (SQLException e) {
			System.err.println("Database :: Error al realizar la consulta de empleados");
		}
		return r;
	}
	
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenListaTurnosContrato(int)
	 */
	public ResultSet obtenListaTurnosContrato(int idEmpl) {
		ResultSet r = null;
		String q = "SELECT " + tablaTurnosPorContrato + ".IdTurno FROM " + tablaUsuarios + ", " + tablaTurnosPorContrato + " WHERE NumVendedor = "
		+ idEmpl + " AND " + tablaUsuarios + ".IdContrato = " + tablaTurnosPorContrato + ".IdContrato;";
		try {
			st = con.createStatement();
			r = st.executeQuery(q);
		} catch (SQLException e) {
			e.printStackTrace();
			System.err.println("Database :: Error al obtener los turnos de un contrato:\n\t" + q);
			e.printStackTrace();
		}
		return r;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenTurnosDeContrato(int)
	 */
	public ResultSet obtenTurnosDeContrato(int idContrato) {
		ResultSet r = null;
		String q = "SELECT " + tablaTurnos + ".* FROM " + tablaTurnos + ", " + tablaTurnosPorContrato + 
		" WHERE " + tablaTurnos + ".idTurno = " + tablaTurnosPorContrato + ".idTurno AND " + tablaTurnosPorContrato + ".idContrato = ' "+ idContrato +"';";
		try {
			st = con.createStatement();
			r = st.executeQuery(q);
		} catch (SQLException e) {
			e.printStackTrace();
			System.err.println("Database.obtenTurnosDeContrato :: Error al obtener los turnos de un contrato:\n\t" + q);
			e.printStackTrace();
		}
		return r;
	}
	
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenTurnosDeContratoPorEmpleado(int)
	 */
	public ResultSet obtenTurnosDeContratoPorEmpleado(int idEmpl) {
		ResultSet r = null;
		String q = "SELECT " + tablaTurnos + ".* FROM " + tablaTurnos + ", " + tablaTurnosPorContrato + ", " + tablaUsuarios + 
		" WHERE " + tablaTurnos + ".idTurno = " + tablaTurnosPorContrato + ".idTurno AND " + 
		tablaTurnosPorContrato + ".idContrato = " + tablaUsuarios + ".idContrato AND " +
		tablaUsuarios + ".NumVendedor = ' "+ idEmpl +"';";
		try {
			st = con.createStatement();
			r = st.executeQuery(q);
		} catch (SQLException e) {
			e.printStackTrace();
			System.err.println("Database.obtenTurnosDeContratoPorEmpleado :: Error al obtener los turnos de un contrato:\n\t" + q);
			e.printStackTrace();
		}
		return r;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenMensaje(int)
	 */
	public ResultSet obtenMensaje(int mensaje) {
		ResultSet result = null;
		String q = "SELECT * FROM " + tablaMensajes + " WHERE IdMensaje="
		+ mensaje + ";";
		try {
			st = con.createStatement();
			result = st.executeQuery(q);
		} catch (SQLException e) {
			System.err.println("Database :: Error al obtener los mensajes:\n\t" + q);
		}
		return result;
	}

	
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenMensajesEntrantes(int, int, int)
	 */
	public ResultSet obtenMensajesEntrantes(int vendedor, int inicio, int desp) {
		ResultSet result = null;
		String q = "SELECT * FROM " + tablaDestinatariosMensaje + " JOIN " + tablaMensajes + " WHERE " + tablaDestinatariosMensaje + ".NumVendedor="
		+ vendedor
		+ " AND " + tablaDestinatariosMensaje + ".IdMensaje=" + tablaMensajes + ".IdMensaje LIMIT "
		+ inicio + "," + (inicio + desp) + ";";
		try {
			st = con.createStatement();
			result = st.executeQuery(q);
		} catch (SQLException e) {
			System.err.println("Database :: Error obtenMensajesEntrantes ");
		}
		return result;
	}
	
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenTodosMensajesEntrantes(int)
	 */
	public ResultSet obtenTodosMensajesEntrantes(int vendedor) {
		ResultSet result = null;
		String q = "SELECT * FROM " + tablaDestinatariosMensaje + " JOIN " + tablaMensajes + " WHERE " + tablaDestinatariosMensaje + ".NumVendedor="
		+ vendedor
		+ " AND " + tablaDestinatariosMensaje + ".IdMensaje=" + tablaMensajes + ".IdMensaje ORDER BY Fecha;";
		try {
			st = con.createStatement();
			result = st.executeQuery(q);
		} catch (SQLException e) {
			System.err.println("Database :: Error obtenMensajesEntrantes ");
		}
		return result;
	}
	

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenMensajesSalientes(int, int, int)
	 */
	public ResultSet obtenMensajesSalientes(int id, int inicio, int desp) {
		ResultSet r = null;

		try {
			st = con.createStatement();
			r = st
					.executeQuery("SELECT * FROM " + tablaMensajes + " WHERE Remitente=" + id
							+ " ORDER BY Fecha LIMIT " + inicio + ","
							+ (inicio + desp));

		}

		catch (SQLException e) {
			System.err.println("Database :: Error al realizar la consulta Lista de Turnos ");
		}
		return r;
	}
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenNombreTodosDepartamentos()
	 */
	public ResultSet obtenNombreTodosDepartamentos() {
		ResultSet r = null;
		try {
			st = con.createStatement();
			r = st.executeQuery("SELECT Nombre FROM " + tablaDepartamentos);
		}
		catch (SQLException e) {
			System.err.println("Database :: Error al realizar la consulta en departamento ");
		}
		return r;		
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenSuperior(int)
	 */
	public ResultSet obtenSuperior(int nvend) {
		ResultSet r = null;
		try {
			st = con.createStatement();
			r = st
					.executeQuery("SELECT * FROM " + tablaUsuariosPorDepartamento + "," + tablaDepartamentos + " WHERE NumVendedor = "
							+ nvend
							+ " and " + tablaDepartamentos + ".Nombre=NombreDepartamento");
		} catch (SQLException e) {
			System.err.println("Database :: Error al obtener el superior del empleado ");
		}
		return r;
	}
	
	//Cambiar el jefe de un Dpto.
	
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenTodosContratos()
	 */
	public ResultSet obtenTodosContratos() {
		ResultSet r = null;
		try {
			st = con.createStatement();
			r = st.executeQuery("SELECT * FROM " + tablaContratos);
		} catch (SQLException e) {
			System.err.println("Database :: Error al realizar la consulta en CONTRATO ");
		}
		return r;
	}	
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenTodosDepartamentos()
	 */
	public ResultSet obtenTodosDepartamentos() {
		ResultSet r = null;
		try {
			st = con.createStatement();
			r = st.executeQuery("SELECT * FROM " + tablaDepartamentos);
		} catch (SQLException e) {
			System.err.println("Database :: Error al realizar la consulta en departamento ");
		}
		return r;
	}	
	
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenTodosNombresJefes()
	 */
	public ResultSet obtenTodosNombresJefes() {
		ResultSet r = null;
		try {
			st = con.createStatement();
			r = st.executeQuery("SELECT Nombre, Apellido1, Apellido2, NumVendedor FROM " + tablaUsuarios + " WHERE Rango='"+2+"';");
		} catch (SQLException e) {
			System.err.println("Database :: Error al realizar la consulta de nombres de (posibles) jefes de departamento ");
		}
		return r;
	}
	
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenTodosJefes()
	 */
	public ResultSet obtenTodosJefes() {
		ResultSet r = null;
		try {
			st = con.createStatement();
			r = st.executeQuery("SELECT * FROM " + tablaUsuarios + " WHERE Rango='"+2+"';");
		} catch (SQLException e) {
			System.err.println("Database :: Error al realizar la consulta de nombres de (posibles) jefes de departamento ");
		}
		return r;
	}
	
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenTodosNumerosDEPARTAMENTOs()
	 */
	public ResultSet obtenTodosNumerosDEPARTAMENTOs() {
		ResultSet r = null;
		try {
			st = con.createStatement();
			r = st.executeQuery("SELECT Numero FROM " + tablaNumerosPorDepartamento + " ';");
		} catch (SQLException e) {
			System.err.println("Database :: Error al realizar la consulta del Jefe del Dpto");
		}
		return r;
	}		
	
	
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenTodosNumVendedoresJefes()
	 */
	public ResultSet obtenTodosNumVendedoresJefes() {
		ResultSet r = null;
		try {
			st = con.createStatement();
			r = st.executeQuery("SELECT NumVendedor FROM " + tablaUsuarios + " WHERE Rango='"+2+"';");
		} catch (SQLException e) {
			System.err.println("Database :: Error al realizar la consulta de nombres de (posibles) jefes de departamento ");
		}
		return r;
	}
	
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenTodosTurnos()
	 */
	public ResultSet obtenTodosTurnos() {
		ResultSet r = null;
		try {
			st = con.createStatement();
			r = st.executeQuery("SELECT * FROM " + tablaTurnos);
		} catch (SQLException e) {
			System.err.println("Database :: Error al realizar la consulta en TURNOS ");
		}
		return r;
	}
	
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenTurno(int)
	 */
	public ResultSet obtenTurno(int turno) {
		ResultSet result = null;
		try {
			st = con.createStatement();
			result = st.executeQuery("SELECT * FROM " + tablaTurnos + " WHERE IdTurno="
					+ turno + ";");
		} catch (SQLException e) {
			System.err.println("Database :: Error obtenTurno ");
		}
		return result;
	}
	
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenTurnoEmpleadoDia(java.sql.Date, int)
	 */
	public ResultSet obtenTurnoEmpleadoDia(Date dia, int idEmpleado) {
		ResultSet r = null;
		try {
			st = con.createStatement();
			r = st
					.executeQuery("SELECT IdTurno FROM " + tablaTrabaja + " WHERE NumVendedor = "
							+ idEmpleado + " and Fecha ='" + dia + "'");
		} catch (SQLException e) {
			System.err.println("Database :: Error al obtener el turno de una fecha concreta ");
		}
		return r;
	}
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenTurnoFavorito(int)
	 */
	public ResultSet obtenTurnoFavorito(int nvend) {
		ResultSet r = null;
		try {
			st = con.createStatement();
			r = st
					.executeQuery("SELECT IdTurno FROM " + tablaUsuarios + " WHERE NumVendedor="
							+ nvend + ";");
		} catch (SQLException e) {
			System.err.println("Database :: Error al realizar la consulta del turno favorito del usuario ");
		}
		return r;
	}
	
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenTurnosDepartamento(java.lang.String)
	 */
	public ResultSet obtenTurnosDepartamento(String departamento) {
		ResultSet r = null;
		try {
			st = con.createStatement();
			/**
			Otra posibilidad, un poco menos guarra
			
			SELECT * from TURNOS WHERE IdTurno IN (
				SELECT l.IdTurno FROM ListaTurnosPorContrato l, CONTRATO c, USUARIO u, DepartamentoUsuario d WHERE
				l.IdContrato = c.IdContrato AND
				c.IdContrato = u.IdContrato AND
				u.NumVendedor = d.NumVendedor AND
				d.NombreDepartamento = "DatosFijos"
			);

			 */
			
//			r = st.executeQuery("SELECT * FROM TURNOS WHERE IdTurno IN ("
//					+ "SELECT IdTurno FROM ListaTurnosPorContrato WHERE IdContrato IN ("
//					+ "SELECT IdContrato FROM CONTRATO WHERE IdContrato IN ("
//					+ "SELECT IdContrato FROM " + tablaUsuarios+ " WHERE NumVendedor IN ("
//					+ "SELECT NumVendedor FROM " + tablaUsuariosPorDepartamento + " WHERE "
//					+ "NombreDepartamento = '"+ departamento +"'))));");

			r = st.executeQuery("SELECT * FROM " + tablaTurnos + " WHERE IdTurno IN ("
					+ "SELECT l.IdTurno FROM " + tablaTurnosPorContrato + " l, " + tablaContratos + " c, " + tablaUsuarios + " u, " + tablaUsuariosPorDepartamento + " d WHERE "
					+ "l.IdContrato = c.IdContrato AND "
					+ "c.IdContrato = u.IdContrato AND "
					+ "u.NumVendedor = d.NumVendedor AND "
					+ "NombreDepartamento = '"+ departamento +"');");
			
		} catch (SQLException e) {
			e.printStackTrace();
			System.err.println("Database :: Error al realizar la consulta de turnos de contratos");
		}
		return r;
	}	
	
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#obtenTurnosDeUnContrato(int)
	 */
	public ResultSet obtenTurnosDeUnContrato(int idContrato) {
		ResultSet r = null;
		try {
			st = con.createStatement();
			r = st
					.executeQuery("SELECT IdTurno FROM " + tablaTurnosPorContrato + " WHERE IdContrato="
							+ idContrato + ";");
		} catch (SQLException e) {
			System.err.println("Database :: Error al realizar la consulta en departamento ");
		}
		return r;
	}	
	
	
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#run()
	 */
	public void run() {
		abrirConexion();
	}	
	
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#trabajaEmpleadoDia(int, java.sql.Date)
	 */
	public ResultSet trabajaEmpleadoDia(int nv,Date d) {
		ResultSet r = null;
		try {
			st = con.createStatement();
			r = st.executeQuery("SELECT IdTurno FROM " + tablaTrabaja + " WHERE NumVendedor='"+nv+"' AND Fecha='"+d+"';");
		} catch (SQLException e) {
			System.err.println("Database :: Error al realizar la consulta del Jefe del Dpto");
		}
		return r;
	}
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#getDepartamentoPorNumero(int)
	 */
	public ResultSet getDepartamentoPorNumero(int numero) {
		ResultSet r = null;
		try {
			st = con.createStatement();
			r = st.executeQuery("SELECT * FROM " + tablaNumerosPorDepartamento + " WHERE Numero="+numero+";");
		} catch (SQLException e) {
			System.err.println("Database :: Error al realizar la consulta del Numero del Dpto");
		}
		return r;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#vaciarTabla(java.lang.String)
	 */
	public boolean vaciarTabla(String nombre) {
		ResultSet r = null;
		try {
			st = con.createStatement();
			r = st.executeQuery("TRUNCATE TABLE " + nombre);
		} catch (SQLException e) {
			System.err.println("Database :: Error al vaciar la tabla");
			return false;
		}
		return true;
	}	
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#eliminarTodasLasTablas()
	 */
	public void eliminarTodasLasTablas() {
		try {
			st = con.createStatement();
			st.addBatch("DROP TABLE " + tablaContratosPorDepartamento + ";");
			st.addBatch("DROP TABLE " + tablaDestinatariosMensaje + ";");
			st.addBatch("DROP TABLE " + tablaDistribucionHorarios + ";");
			st.addBatch("DROP TABLE " + tablaFestivos + ";");
			st.addBatch("DROP TABLE " + tablaIncidenciasPorUsuario + ";");
//			st.addBatch("DROP TABLE " + tablaIssues + ";");
			st.addBatch("DROP TABLE " + tablaMensajes + ";");
			st.addBatch("DROP TABLE " + tablaOpiniones + ";");
			st.addBatch("DROP TABLE " + tablaTrabaja + ";");
			st.addBatch("DROP TABLE " + tablaTurnosPorContrato + ";");
			st.addBatch("DROP TABLE " + tablaUsuariosPorDepartamento + ";");
			st.addBatch("DROP TABLE " + tablaVentas + ";");
//			st.addBatch("DROP TABLE " + tablaPermisos + ";");
			st.addBatch("DROP TABLE " + tablaNumerosPorDepartamento + ";");
			st.addBatch("DROP TABLE " + tablaIncidencias + ";");
			st.addBatch("DROP TABLE " + tablaSugerencias + ";");
			st.addBatch("DROP TABLE " + tablaDepartamentos + ";");
			st.addBatch("DROP TABLE " + tablaUsuarios + ";");
			st.addBatch("DROP TABLE " + tablaContratos + ";");
			st.addBatch("DROP TABLE " + tablaTurnos + ";");
			st.executeBatch();
			st.close();
			System.out.println("aplicacion.Database.java\t:: Estructura de tablas y dependencias eliminadas correctamente.");

		} catch (SQLException e) {
			System.err.println("Database :: Error al borrar las tablas - ¿Quizá estén ya vacías?");
		}
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#crearTablas()
	 */
	public void crearTablas() {
		try {
			st = con.createStatement();
			st.addBatch("Create table contrato (" +
					"IdContrato Int NOT NULL AUTO_INCREMENT," +
					"TurnoInicial Int NOT NULL," +
					"Nombre Varchar(20) ," +
					"Patron Varchar(150) ," +
					"DuracionCiclo Int ," +
					"Salario Decimal(8,2) ," +
					"Tipo tinyint(1)," +
					"UNIQUE (Nombre)," +
					"Primary Key (IdContrato)) ENGINE=InnoDB DEFAULT CHARSET=latin1;");

			st.addBatch("Create table contratodepartamento(" +
					"NombreDept varchar(20)," +
					"IdContrato Int NOT NULL," +
					"Primary Key (NombreDept,IdContrato)) ENGINE=InnoDB DEFAULT CHARSET=latin1;");
			
			st.addBatch("Create table departamento (" +
					"Nombre Varchar(20) ," +
					"JefeDepartamento Int NOT NULL," +
					"HoraApertura time," +
					"HoraCierre time," +
					"Primary Key (nombre)) ENGINE=InnoDB DEFAULT CHARSET=latin1;");

			st.addBatch("Create table departamentousuario (" +
					"NumVendedor  int not null," +
					"NombreDepartamento Varchar(20)  not null," +
					"Primary Key (NumVendedor,NombreDepartamento)) ENGINE=InnoDB DEFAULT CHARSET=latin1;");


			st.addBatch("Create table destinatario (" +
					"NumVendedor Int NOT NULL," +
					"IdMensaje Int NOT NULL," +
					"Primary Key (NumVendedor,IdMensaje)) ENGINE=InnoDB DEFAULT CHARSET=latin1;");
					
			st.addBatch("Create table distribucion (" +
					"Hora Int NOT NULL," +
					"DiaSemana int(12) NOT NULL," +
					"Patron Varchar(20) ," +
					"NumMax Int ," +
					"NumMin Int ," +
					"NombreDept varchar(20) NOT NULL," +
					"Primary Key (Hora,DiaSemana,NombreDept)) ENGINE=InnoDB DEFAULT CHARSET=latin1;");

			st.addBatch("Create table festivos (" +
					"Hora Int NOT NULL," +
					"Fecha Date NOT NULL," +
					"Patron Varchar(20) ," +
					"NumMax Int ," +
					"NumMin Int ," +
					"NombreDept varchar(20) NOT NULL," +
					"Primary Key (Hora,Fecha,Nombredept))" +
					" ENGINE=InnoDB DEFAULT CHARSET=latin1;");


			st.addBatch("Create table incidencias (" +
					"IdIncidencia Int NOT NULL AUTO_INCREMENT," +
					"Descripcion Varchar(40)  not null," +
					"Primary Key (IdIncidencia)) ENGINE=InnoDB DEFAULT CHARSET=latin1;");

//			st.addBatch("Create table issues (" +
//					"Text longtext not null);");

			st.addBatch("Create table listaturnosporcontrato(" +
					"IdTurno Int NOT NULL," +
					"IdContrato Int NOT NULL," +
					"Primary Key (IdTurno,IdContrato)) ENGINE=InnoDB DEFAULT CHARSET=latin1;");

			st.addBatch("Create table mensaje (" +
					"IdMensaje Int NOT NULL AUTO_INCREMENT," +
					"Remitente Int NOT NULL," +
					"Fecha Datetime ," +
					"Asunto Varchar(100) ," +
					"Texto Text ," +
					"Marcado tinyint(1)," +
					"visto tinyint(1)," +
					"Primary Key (IdMensaje)) ENGINE=InnoDB DEFAULT CHARSET=latin1;");

			st.addBatch("Create table numerosdepartamentos (" +
					"Nombre Varchar(20) ," +
					"Numero Int NOT NULL," +
					"Primary Key (nombre,numero)) ENGINE=InnoDB DEFAULT CHARSET=latin1;");

			st.addBatch("Create table opinion (" +
					"Id Int NOT NULL AUTO_INCREMENT," +
					"NombreApellidos varchar(30) not null," +
					"Grupo varchar(20) ," +
					"Respuesta1 longtext," +
					"Respuesta2 longtext," +
					"Respuesta3 longtext," +
					"Respuesta4 longtext," +
					"Respuesta5 longtext," +
					"Primary Key (Id)) ENGINE=InnoDB DEFAULT CHARSET=latin1;");

/*			st.addBatch("Create table permisos (" +
					"Rango int not null," +
					"OPCIONESPORDEFINIR Char(20) ," +
					"Primary Key (Rango)) ENGINE=InnoDB DEFAULT CHARSET=latin1;");
*/

			st.addBatch("Create table tieneincidencia (" +
					"IdIncidencia Int NOT NULL," +
					"NumVendedor Int NOT NULL," +
					"FechaInicio Date NOT NULL," +
					"FechaFin Date ," +
					"check(fechainicio<fechafin)," +
					"Primary Key (IdIncidencia,NumVendedor,FechaInicio)) ENGINE=InnoDB DEFAULT CHARSET=latin1;");

			st.addBatch("Create table trabaja (" +
					"NumVendedor Int NOT NULL," +
					"IdTurno Int NOT NULL," +
					"Fecha Date NOT NULL," +
					"HoraEntrada Time ," +
					"HoraSalida Time ," +
					"check(horaentrada<horasalida)," +
					"Primary Key (NumVendedor,IdTurno,Fecha)) ENGINE=InnoDB DEFAULT CHARSET=latin1;");

			st.addBatch("Create table turnos (" +
					"IdTurno Int NOT NULL AUTO_INCREMENT," +
					"Descripcion Varchar(40) ," +
					"Abreviatura Varchar(2), " +
					"HoraEntrada Time ," +
					"HoraSalida Time ," +
					"HoraInicioDescanso time ," +
					"DuracionDescanso time," +
					"Color varchar(6)," +
					"check (horaentrada<horasalida)," +
					"Primary Key (IdTurno)) ENGINE=InnoDB DEFAULT CHARSET=latin1;");

			st.addBatch("Create table usuario (" +
					"NumVendedor Int NOT NULL," +
					"Nombre Varchar(20) ," +
					"Apellido1 Varchar(20) ," +
					"Apellido2 Varchar(20) ," +
					"FechaNacimiento Date ," +
					"Sexo int ," +
					"Email Varchar(30) ," +
					"Password Varchar(10) ," +
					"IndicadorGrupo int ," +
					"FechaContrato Date ," +
					"FechaEntrada Date ," +
					"HorasExtras Int ," +
					"Felicidad int," +
					"Idioma int," +
					"Rango int NOT NULL," +
					"IdContrato Int NOT NULL," +
					"IdTurno Int NOT NULL," +					
					"Color varchar(6)," +
					"Telefono varchar(12)," +
					"Ssid varchar(20)," +
					"HaEntrado bool," +
					"UltimoAcceso Datetime," +
					"Posicion int," +
					"FinContrato Date," +
					"check (length(numvendedor)=3)," +
					"check (sexo in(0,1))," +
					"check(idioma in(0,1,2))," +
					"check(indicadorgrupo in(0,1))," +
					"Primary Key (NumVendedor)) ENGINE=InnoDB DEFAULT CHARSET=latin1;");

			st.addBatch("Create table ventas (" +
					"NumVendedor Int," +
					"Fecha Datetime ," +
					"Importe Decimal(10,2) ," +
					"Primary Key (NumVendedor,fecha)) ENGINE=InnoDB DEFAULT CHARSET=latin1;");
			
			st.addBatch("Create table sugerencias (" +
 					"NombreDept varchar(20) NOT NULL," +
 					"Fecha Date NOT NULL," +
 					"HoraInicio Time NOT NULL," +
 					"Texto Varchar(100) ," +
 					"Primary Key (NombreDept,fecha,horaInicio)) ENGINE=InnoDB DEFAULT CHARSET=latin1;");

			st.executeBatch();
			st.close();
			st = con.createStatement();

			// Insertar contrato inicial para jefe
			st.executeUpdate("INSERT INTO " + tablaTurnos + " (IdTurno) values (1);");
			st.executeUpdate("INSERT INTO " + tablaContratos + " (IdContrato, TurnoInicial) values (1,1);");

			
			System.out.println("aplicacion.Database.java\t:: Estructura de tablas generada correctamente.");
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#crearDependencias()
	 */
	public void crearDependencias() {
		try {
			st = con.createStatement();

			st.addBatch("Alter table tieneincidencia add Index IX_TieneIncidencia (IdIncidencia);");
			st.addBatch("Alter table tieneincidencia add Foreign Key (IdIncidencia) references incidencias (IdIncidencia) on delete cascade on update cascade;");
			st.addBatch("Alter table ventas add Index IX_vende (NumVendedor);");
			st.addBatch("Alter table ventas add Foreign Key (NumVendedor) references usuario (NumVendedor) on delete restrict on update cascade;");
			st.addBatch("Alter table tieneincidencia add Index IX_TieneIncidencia2 (NumVendedor);");
			st.addBatch("Alter table tieneincidencia add Foreign Key (NumVendedor) references usuario (NumVendedor) on delete cascade on update cascade;");
			st.addBatch("Alter table trabaja add Index IX_Trabaja1 (NumVendedor);");
			st.addBatch("Alter table trabaja add Foreign Key (NumVendedor) references usuario (NumVendedor) on delete restrict on update restrict;");
			st.addBatch("Alter table destinatario add Index IX_Recibe1 (NumVendedor);");
			st.addBatch("Alter table destinatario add Foreign Key (NumVendedor) references usuario (NumVendedor) on delete restrict on update cascade;");
			st.addBatch("Alter table departamento add Index IX_jefedepartamento (JefeDepartamento);");
			st.addBatch("Alter table departamento add Foreign Key (JefeDepartamento) references usuario (NumVendedor) on delete restrict on update cascade;");
			st.addBatch("Alter table mensaje add Index IX_envia (Remitente);");
			st.addBatch("Alter table mensaje add Foreign Key (Remitente) references usuario (NumVendedor) on delete restrict on update cascade;");
			st.addBatch("Alter table listaturnosporcontrato add Index IX_TurnosPorContrato (IdContrato);");
			st.addBatch("Alter table listaturnosporcontrato add Foreign Key (IdContrato) references contrato (IdContrato) on delete cascade on update cascade;");
			st.addBatch("Alter table usuario add Index IX_TieneContrato (IdContrato);");
			st.addBatch("Alter table usuario add Foreign Key (IdContrato) references contrato (IdContrato) on delete restrict on update cascade;");
			st.addBatch("Alter table listaturnosporcontrato add Index IX_TurnosPorContratos (IdTurno);");
			st.addBatch("Alter table listaturnosporcontrato add Foreign Key (IdTurno) references turnos (IdTurno) on delete cascade on update cascade;");
			st.addBatch("Alter table trabaja add Index IX_Trabaja2 (IdTurno);");
			st.addBatch("Alter table trabaja add Foreign Key (IdTurno) references turnos (IdTurno) on delete restrict on update cascade;");
			st.addBatch("Alter table contrato add Index IX_TurnoInicial (TurnoInicial);");
			st.addBatch("Alter table contrato add Foreign Key (TurnoInicial) references turnos (IdTurno) on delete restrict on update cascade;");
			st.addBatch("Alter table usuario add Index IX_Prefiere (IdTurno);");
			st.addBatch("Alter table usuario add Foreign Key (IdTurno) references turnos (IdTurno) on delete restrict on update cascade;");
//			st.addBatch("Alter table usuario add Index IX_TienePermiso (Rango);");
//			st.addBatch("Alter table usuario add Foreign Key (Rango) references permisos (Rango) on delete restrict on update cascade;");
			
			
			st.addBatch("Alter table distribucion add Index IX_Relationship10 (NombreDept);");
			st.addBatch("Alter table distribucion add Foreign Key (NombreDept) references departamento (Nombre) on delete cascade on update cascade;");
			st.addBatch("Alter table festivos add Index IX_Relationship11 (NombreDept);");
			st.addBatch("Alter table festivos add Foreign Key (NombreDept) references departamento (Nombre) on delete cascade on update cascade;");
			st.addBatch("Alter table destinatario add Index IX_Recibe2 (IdMensaje);");
			st.addBatch("Alter table destinatario add Foreign Key (IdMensaje) references mensaje (IdMensaje) on delete cascade on update cascade;");

			
			st.addBatch("Alter table departamentousuario add Index IX_Relationship12 (NumVendedor);");
			st.addBatch("Alter table departamentousuario add Foreign Key (NumVendedor) references usuario (NumVendedor) on delete cascade on update cascade;");
			st.addBatch("Alter table departamentousuario add Index IX_Relationship13 (NombreDepartamento);");
			st.addBatch("Alter table departamentousuario add Foreign Key (NombreDepartamento) references departamento (Nombre) on delete restrict on update cascade;");

			st.addBatch("Alter table contratodepartamento add Index IX_Relationship19 (NombreDept);");
			st.addBatch("Alter table contratodepartamento add Foreign Key (NombreDept) references departamento (Nombre) on delete cascade on update cascade;");

			st.addBatch("Alter table contratodepartamento add Index IX_Relationship17 (IdContrato);");
			st.addBatch("Alter table contratodepartamento add Foreign Key (IdContrato) references contrato (IdContrato) on delete restrict on update cascade;");
						
			st.addBatch("Alter table sugerencias add Index IX_Sugerencia1 (NombreDept);");
 			st.addBatch("Alter table sugerencias add Foreign Key (NombreDept) references departamento (Nombre) on delete cascade on update cascade;");
 


			st.executeBatch();
			st.close();
			System.out.println("aplicacion.Database.java\t:: Dependencias generadas correctamente.");
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	/* (non-Javadoc)
	 * @see aplicacion.i_Database#insertarVentasACapon(java.util.ArrayList)
	 */ 
	public void insertarVentasACapon(ArrayList<Integer> idVends) {
		Random rnd=new Random(5000);
		String query = "INSERT INTO ventas \n";
		int ventas;
		for (int i=0; i<idVends.size(); i++)
			for (int m = 1; m <= 12; m++)
				for (int d = 1; d <= Util.dameDias(m,2008); d++) {
					ventas = rnd.nextInt(5000);
					query += "SELECT '" + idVends.get(i) + "', '2008-"+m+"-"+d+"', '"+ventas+"'\n";
					if (!(m==12 && d==31 && i==idVends.size()-1)) query += "UNION ALL \n";
				}
		//System.out.println(query);
		try {
			st = con.createStatement();
			st.executeUpdate(query);
		} catch (SQLException e) {
			
		}
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#isIntentandoConectar()
	 */
	public boolean isIntentandoConectar() {
		return intentandoConectar;
	}

	/* (non-Javadoc)
	 * @see aplicacion.i_Database#setIntentandoConectar(boolean)
	 */
	public void setIntentandoConectar(boolean intentandoConectar) {
		this.intentandoConectar = intentandoConectar;
	}

}